A couple of hours with (the) Julia (language)

Julia

Julia es un lenguaje de alto nivel que permite escribir código de manera fácil y rápida, pero con una velocidad de ejecución similar a la de C (~ 2x)


In [1]:
inferior = 0.0
superior = 1.0

λ = 0.05 # Unicode characters are allowed as names: \lambda<tab>

inferior <= λ <= superior


Out[1]:
true

Julia posee varios built-in types, como Float64 que representa a un número de coma flotante de 64 bits. Pero lo interesante es que los types creados por los usuarios son tan rápidos como los built-in.


In [2]:
typeof(λ)


Out[2]:
Float64

In [3]:
λ::Float64 # Type assertion


Out[3]:
0.05

In [4]:
λ::Int # Type assertion


LoadError: TypeError: typeassert: expected Int64, got Float64
while loading In[4], in expression starting on line 1

De hecho, Julia es un lenguaje homoiconico, por lo que su biblioteca base está escrita en Julia.
La definición de Float64 en Julia es:

abstract Number
abstract Real     <: Number
abstract FloatingPoint <: Real

bitstype 32 Float32 <: FloatingPoint
bitstype 64 Float64 <: FloatingPoint

In [5]:
super(Float64)


Out[5]:
AbstractFloat

In [6]:
subtypes(FloatingPoint)


WARNING: Base.FloatingPoint is deprecated, use AbstractFloat instead.
Out[6]:
4-element Array{Any,1}:
 BigFloat
 Float16 
 Float32 
 Float64 

Julia es JIT (just-in-time) compiled, por lo que la primera vez que se llama a una función, su tiempo de ejecución es más lento (porque es compilada) pero la segunda vez es casi tan rápida como si corriera en C (dado que fue compilada específicamente para el tipo de datos de sus argumentos)


In [7]:
@elapsed λ * 100


Out[7]:
0.000676093

In [8]:
@elapsed λ * 100


Out[8]:
1.513e-6

Para Julia es posible elegir el método más específico para cada combinación de tipos de argumentos, debido a su diseño basado en multiple dispatch. Uno puede preguntar por el método que se ejecutó usando el macro @which


In [9]:
@which λ * 100::Int


Out[9]:
*(x::Number, y::Number) at promotion.jl:168

In [10]:
@which λ * Float64(100)


Out[10]:
*(x::Float64, y::Float64) at float.jl:208

Arrays

En Julia los arrays son tipos de datos paramétricos, definidos por el tipo de datos que contienen y su dimensión. Por ejemplo una lista de Python sería un array unidimensional que contiene cualquier tipo de datos: Array{Any,1}


In [11]:
lista = [1, λ, π, "Hola mundo"]


Out[11]:
4-element Array{Any,1}:
  1                    
  0.05                 
 π = 3.1415926535897...
   "Hola mundo"        

In [12]:
typeof(lista)


Out[12]:
Array{Any,1}

Si un array contiene siempre un mismo tipo de datos, su almacenamiento en memoria es más eficiente si lo declaramos. A su vez las funciones que lo utilizan se ejecutarán de manera más eficiente/rápida (porque el compilador puede predecir el tipo de datos que va a obtener de array).


In [13]:
identidad = Float64[62, 95, 99, 30]


Out[13]:
4-element Array{Float64,1}:
 62.0
 95.0
 99.0
 30.0

In [14]:
identidad[1] # Los Arrays se acceden desde 1


Out[14]:
62.0

In [15]:
identidad[2:3] # Es posible acceder usando rangos start:end


Out[15]:
2-element Array{Float64,1}:
 95.0
 99.0

In [16]:
identidad[end] = 100 # Es posible asignar un elemento a un índice en particular, "end" permite obtener el último ítem
identidad


Out[16]:
4-element Array{Float64,1}:
  62.0
  95.0
  99.0
 100.0

Es posible indexar un array usando otro array, por ejemplo usando arrays lógicos


In [17]:
usar = identidad .> 95.0 # .> compara el array elemento a elemento


Out[17]:
4-element BitArray{1}:
 false
 false
  true
  true

In [18]:
identidad[ usar ]


Out[18]:
2-element Array{Float64,1}:
  99.0
 100.0

Existen varias dequeue functions en Julia. Dado que modifican el array que reciben, por cenvención sus nombres terminan en !, por ejemplo:

push! # Al final del array
pop!

shift! # Al inicio del array
unshift!

splice! # En medio del array

In [19]:
push!(identidad, 30)
identidad


Out[19]:
5-element Array{Float64,1}:
  62.0
  95.0
  99.0
 100.0
  30.0

In [20]:
segundo = splice!(identidad, 2)


Out[20]:
95.0

In [21]:
identidad


Out[21]:
4-element Array{Float64,1}:
  62.0
  99.0
 100.0
  30.0

Arrays multidimensionales


In [22]:
matrix = [ 0.5 0.6 
           0.7 0.8 ]


Out[22]:
2x2 Array{Float64,2}:
 0.5  0.6
 0.7  0.8

In [23]:
matrix[2,1] # Fila 2, Columna 1


Out[23]:
0.7

In [24]:
matrix[3] # La matriz se almacena de manera continua en memoria; column-major order.


Out[24]:
0.6

Dicts

Dict es a Julia lo que un hash es a Perl o un dict a Python. Una manera de almacenar datos asociados. Dict es también un tipo de dato paramétrico determinado por el tipo de sus llaves (keys) y valores (values).


In [25]:
map = Dict('A'=>1, 'B'=>2, 'C'=>3)


Out[25]:
Dict{Char,Int64} with 3 entries:
  'B' => 2
  'C' => 3
  'A' => 1

In [26]:
map['D'] = 4 # Agrega un nuevo par (Pair) llave => valor al diccionario


Out[26]:
4

In [27]:
map['A'] = 5 # Si la llave ya existe, el valor es reemplazado

map


Out[27]:
Dict{Char,Int64} with 4 entries:
  'D' => 4
  'B' => 2
  'C' => 3
  'A' => 5

Accediendo valores del diccionario


In [28]:
map['B']


Out[28]:
2

In [29]:
map['E'] # Error: 'E' no está en map


LoadError: KeyError: E not found
while loading In[29], in expression starting on line 1

 in getindex at dict.jl:718

In [30]:
get(map, 'E', 0) # Es posible usar get para definir un valor default que evite el error


Out[30]:
0

Test membership

Testear si un elemento está presente (in o ) en un hash table (si es llave de un Dict o si está presente en un Set) es O(1) mientras que testear pertenencia en un Array es O(n).


In [31]:
haskey(map, 'E') # O (1)


Out[31]:
false

In [32]:
'E' in keys(map) # Notación similar a la de Python


Out[32]:
false

In [33]:
'E'  keys(map) # \in<tab> para una notación más matemática de la pertenencia


Out[33]:
false

In [34]:
array = ['A', 'B', 'C', 'D', 'D', 'D']

'E' in array # O(n)


Out[34]:
false

In [35]:
conjunto = Set(array) # Conjunto de valores únicos


Out[35]:
Set(['D','B','C','A'])

In [36]:
'E' in conjunto # O(1)


Out[36]:
false

Control de flujo

If

Evaluación condicional


In [37]:
identidad = rand() * 100.0


Out[37]:
50.08086280725106

In [38]:
if identidad == 100.0
    println("Idénticas")
elseif identidad >= 30 # Opcional
    println("Homólogas")
else  # Opcional
    println("Twilight")
end


Homólogas

Operador ternario

Similar al operador ternario de C (o Perl), útil para asignación condicional


In [39]:
numero = rand(1:100)


Out[39]:
55

In [40]:
if numero % 2 == 0
    es_par = "si"
else
    es_par = "no"
end

es_par


Out[40]:
"no"

In [41]:
es_par = numero % 2 == 0 ? "si" : "no"


Out[41]:
"no"

Short-circuit evaluation

  • && # Y, si el primer término es falso, el segundo no se evalúa
  • || # O, si el primer término es verdadero, no se evalúa el segundo

In [42]:
numero % 2 == 0 && println("par")


Out[42]:
false

In [43]:
numero % 2 != 0 && println("impar")

Loops


In [44]:
numero = 0
limite = 3
while numero < limite
    numero += 1
    println(numero)
end


impar
1

In [45]:
carpeta = "data"
archivos = readdir(carpeta)


Out[45]:
4-element Array{ByteString,1}:
 "Empty.fasta"           
 "Gaoetal2011.fasta"     
 "PF09645_full.fasta"    
 "PF09645_full.stockholm"

In [46]:
for nombre in archivos # for arch = archivos
    println(nombre)
end


2
3
Empty.fasta

En Julia los fors son reescritos como whiles, usando las funciones start para inicializar la iteración, done para testear si se alcanzó el final de la iteración y nextpara obtener el valor de la iteración y el del próximo estado. Uno puede definir estas funciones para cualquier tipo propio que quiera hacer iterable.


In [47]:
state = start(archivos) # state = 1
while !done(archivos, state) # !( state > length(archivos) )
    (nombre, state) = next(archivos, state) # archivos[state], state + 1
    println(nombre)
end

List Comprehensions


In [48]:
for nombre in archivos
    println( joinpath(carpeta, nombre) )
end

In [49]:
len = length(archivos) 
lista = Array(Int, len)
for i in 1:len
    lista[i] = filesize(joinpath(carpeta, archivos[i])) # Tamaño en bytes
end
lista


Out[49]:
4-element Array{Int64,1}:
    0
   77
  558
 1277

In [50]:
lista = [ filesize(joinpath(carpeta, nombre)) for nombre in archivos ]


Gaoetal2011.fasta
PF09645_full.fasta
PF09645_full.stockholm
Empty.fasta
Gaoetal2011.fasta
PF09645_full.fasta
PF09645_full.stockholm
data/Empty.fasta
data/Gaoetal2011.fasta
data/PF09645_full.fasta
data/PF09645_full.stockholm
Out[50]:
4-element Array{Int64,1}:
    0
   77
  558
 1277

Strings

Los strings son secuencias finitas de caracteres. En sus principios la bioinformática se trató del análisis de secuencias de caracteres (utilizando la codificación ASCII de 8 bits), lo que hizo popular a Perl en el área. Julia tiene un buen soporte para strings:


In [51]:
cadena_unicode = "∃x ∈ B ∧ x ∈ A"


Out[51]:
"∃x ∈ B ∧ x ∈ A"

In [52]:
typeof(cadena_unicode)


Out[52]:
UTF8String

In [53]:
cadena_ascii = "A es un subconjunto de B"


Out[53]:
"A es un subconjunto de B"

In [54]:
typeof(cadena_ascii)


Out[54]:
ASCIIString

Es seguro iterar sobre un string (inmutable) para obtener sus caracteres. Si se quiere obtener un Vector{Char} (Array de una dimensión, mutable) se puede usar list comprehension o la función collect.


In [55]:
for char in cadena_ascii
    print(char)
end


A 

In [56]:
for char in cadena_unicode
    print(char)
end

In [57]:
collect(cadena_unicode) # [ char for char in cadena_unicode ]


Out[57]:
14-element Array{Char,1}:
 '∃'
 'x'
 ' '
 '∈'
 ' '
 'B'
 ' '
 '∧'
 ' '
 'x'
 ' '
 '∈'
 ' '
 'A'

Sin embargo, acceder directamente a un string como si fuera un array no es una acción segura dado que un carácter puede estar codificado por más de un valor de 8 bits. Sólo es seguro hacer eso para ASCIIStrings, dado que cada carácter está codificado por un sólo número entero de 8 bits. Pero no es seguro hacerlo para otras codificación. Por ejemplo, la codificación UTF-8 de ∃ (\exists<tab> en la consola) requiere de tres valores de 8 bits:


In [58]:
for i in 1:4
    println(i, " ", cadena_ascii[i])
end


es un subconjunto de B∃x ∈ B ∧ x ∈ A1 

In [59]:
for i in 1:4
    try
        println(i, " ", cadena_unicode[i])
    catch err
        println(i, " ", err) # Error al acceder cadena_unicode[i]
    end
end

Regex: Regular Expression

Las expresiones regulares de Julia se escriben igual a las de Perl, dado que Julia utiliza la biblioteca PCRE2 (Perl Compatible Regular Expressions).


In [60]:
ext_fasta = r"\.fasta$" # r"... permite escribir una expresión regular


Out[60]:
r"\.fasta$"

In [61]:
typeof(ext_fasta)


Out[61]:
Regex

In [62]:
for nombre in archivos
    println(nombre, "\t:\t", ismatch(ext_fasta, nombre)) # ismatch es true si la regex está en el string
end


A
2  
3 e
4 s
1 ∃
2 UnicodeError: invalid character index
3 UnicodeError: invalid character index
4 x
Empty.fasta	:	true

In [63]:
ismatch(r"^>\w{4}\.\w", ">2trx.A")


Out[63]:
true

In [64]:
ismatch(r"^∃x\s+", cadena_unicode) # UNICODE UTF-8


Out[64]:
true

Capturando strings con expresiones regulares


In [65]:
captura = match(r"^>(\w{4})\.(\w)", ">2trx.A")


Out[65]:
RegexMatch(">2trx.A", 1="2trx", 2="A")

In [66]:
if captura != nothing
    println("PDB\t", captura[1]) # captura[1] == captura.captures[1]
    println("Cadena\t", captura[2])
else
    println("No es un PDB ID")
end


Gaoetal2011.fasta	:	true
PF09645_full.fasta	:	true
PF09645_full.stockholm	:	false
PDB	2

In [67]:
captura = match(r"^>(\w{4})\.(\w)", ">PF00085") # nothing no imprime nada en pantalla

In [68]:
if captura != nothing
    println("PDB\t", captura[1])
    println("Cadena\t", captura[2])
else
    println("No es un PDB ID")
end

Capturas con nombre.

A los grupos capturados se les puede asignar un nombre, para luego acceder a ellos usándolos. Pueden definirse como se hace en Perl ?<nombre>, ?’nombre’ o en Python ?P<nombre>


In [69]:
captura = match(r"^>(?'pdb'\w{4})\.(?<cad>\w)", ">2trx.A")


Out[69]:
RegexMatch(">2trx.A", pdb="2trx", cad="A")

In [70]:
captura[:pdb] # :... es un Symbol en Julia (los nombres de variables, funciones, etc son símbolos)


Out[70]:
"2trx"

Interpolation

La interpolación de cadenas en Julia está basada e inspirada en la interpolación de Perl. De hecho, se utiliza el mismo símbolo: \$


In [71]:
A, B = rand(1:6), rand(1:6)

"Su dado es $A, mientras el dado de Julia es $B: $( A > B ? "usted gana" : A != B ? "Julia gana" : "empate")"


Out[71]:
"Su dado es 2, mientras el dado de Julia es 2: empate"

Multiline strings


In [72]:
fasta_2trx = """
>2TRX:A|PDBID|CHAIN|SEQUENCE
SDKIIHLTDDSFDTDVLKADGAILVDFWAEWCGPCKMIAPILDEIADEYQGKLTVAKLNIDQNPGTAPKYGIRGIPTLLL
FKNGEVAATKVGALSKGQLKEFLDANLA
>2TRX:B|PDBID|CHAIN|SEQUENCE
SDKIIHLTDDSFDTDVLKADGAILVDFWAEWCGPCKMIAPILDEIADEYQGKLTVAKLNIDQNPGTAPKYGIRGIPTLLL
FKNGEVAATKVGALSKGQLKEFLDANLA
"""


Out[72]:
">2TRX:A|PDBID|CHAIN|SEQUENCE\nSDKIIHLTDDSFDTDVLKADGAILVDFWAEWCGPCKMIAPILDEIADEYQGKLTVAKLNIDQNPGTAPKYGIRGIPTLLL\nFKNGEVAATKVGALSKGQLKEFLDANLA\n>2TRX:B|PDBID|CHAIN|SEQUENCE\nSDKIIHLTDDSFDTDVLKADGAILVDFWAEWCGPCKMIAPILDEIADEYQGKLTVAKLNIDQNPGTAPKYGIRGIPTLLL\nFKNGEVAATKVGALSKGQLKEFLDANLA\n"

In [73]:
print(fasta_2trx)

In [74]:
"""Una línea, pero con "comillas" simples"""


Out[74]:
"Una línea, pero con \"comillas\" simples"

Lectura/Escritura de archivos

Para abrir un archivo se utiliza la función open (modos r para leer, w para escribir y a para agregar) y close para cerrarlo.


In [75]:
stream = open("data/PF09645_full.fasta", "r")


Out[75]:
IOStream(<file data/PF09645_full.fasta>)

In [76]:
for line in eachline(stream) # Itero para cada línea (incluye '\n')
    print(line)
end


trx
Cadena	A
No es un PDB ID
>2TRX:A|PDBID|CHAIN|SEQUENCE
SDKIIHLTDDSFDTDVLKADGAILVDFWAEWCGPCKMIAPILDEIADEYQGKLTVAKLNIDQNPGTAPKYGIRGIPTLLL
FKNGEVAATKVGALSKGQLKEFLDANLA
>2TRX:B|PDBID|CHAIN|SEQUENCE
SDKIIHLTDDSFDTDVLKADGAILVDFWAEWCGPCKMIAPILDEIADEYQGKLTVAKLNIDQNPGTAPKYGIRGIPTLLL
FKNGEVAATKVGALSKGQLKEFLDANLA
>C3N734_SULIY/1-95
...mp---NSYQMAEIMYKILQQKKEISLEDILAQFEISASTAYNVQRTLRMICEKHPDE

In [77]:
close(stream)

open( … ) do … asegura que el archivo se cierre si ocurre algún error (implemente un try/catch)


In [78]:
open("data/PF09645_full.fasta", "r") do stream
    for line in eachline(stream)
        print(line)
    end
end

Funciones


In [79]:
function listaralineamientos(direccion, extension::Regex=r"\.fasta$"; vacios::Bool=false)
    archivos = readdir(direccion)
    alns = ASCIIString[]
    for nombre in archivos
        if ismatch(extension, nombre)
            if vacios || filesize(joinpath(direccion, nombre)) >0
                push!(alns, nombre)
            end
        end
    end
    alns
end


Out[79]:
listaralineamientos (generic function with 2 methods)

In [80]:
listaralineamientos("data")


Out[80]:
2-element Array{ASCIIString,1}:
 "Gaoetal2011.fasta" 
 "PF09645_full.fasta"
CEVQTKNRRTIFKWIKNEETTEEGQEE--QEIEKILNAQPAE-------------k....
>H2C869_9CREN/7-104
...nk--LNDVQRAKLLVKILQAKGELDVYDIMLQFEISYTRAIPIMKLTRKICEAQ-EI
CTYDEKEHKLVSLNAKKEKVEQDEEENEREEIEKILDAH----------------trreq
>Y070_ATV/2-70
qsvne-------VAQQLFSKLREKKEITAEDIIAIYNVTPSVAYAIFTVLKVMCQQHQGE
CQAIKRGRKTVI-------------------------------------------vskq.
>F112_SSV1/3-112
.....QTLNSYKMAEIMYKILEKKGELTLEDILAQFEISVPSAYNIQRALKAICERHPDE
CEVQYKNRKTTFKWIKQEQKEEQKQEQTQDNIAKIFDAQPANFEQTDQGFIKAKQ.....>C3N734_SULIY/1-95
...mp---NSYQMAEIMYKILQQKKEISLEDILAQFEISASTAYNVQRTLRMICEKHPDE
CEVQTKNRRTIFKWIKNEETTEEGQEE--QEIEKILNAQPAE-------------k....
>H2C869_9CREN/7-104
...nk--LNDVQRAKLLVKILQAKGELDVYDIMLQFEISYTRAIPIMKLTRKICEAQ-EI
CTYDEKEHKLVSLNAKKEKVEQDEEENEREEIEKILDAH----------------trreq
>Y070_ATV/2-70
qsvne-------VAQQLFSKLREKKEITAEDIIAIYNVTPSVAYAIFTVLKVMCQQHQGE
CQAIKRGRKTVI-------------------------------------------vskq.
>F112_SSV1/3-112
.....QTLNSYKMAEIMYKILEKKGELTLEDILAQFEISVPSAYNIQRALKAICERHPDE
CEVQYKNRKTTFKWIKQEQKEEQKQEQTQDNIAKIFDAQPANFEQTDQGFIKAKQ.....

In [81]:
listaralineamientos("data", vacios=true)


Out[81]:
3-element Array{ASCIIString,1}:
 "Empty.fasta"       
 "Gaoetal2011.fasta" 
 "PF09645_full.fasta"

In [82]:
methods(listaralineamientos)


Out[82]:
2 methods for generic function listaralineamientos:
  • listaralineamientos(direccion) at In[79]:2
  • listaralineamientos(direccion, extension::Regex) at In[79]:2

In [83]:
listaralineamientos("data", r"\.stockholm$")


Out[83]:
1-element Array{ASCIIString,1}:
 "PF09645_full.stockholm"

In [84]:
listarstockholm(carpeta) = listaralineamientos(carpeta, r"\.stockholm$")


Out[84]:
listarstockholm (generic function with 1 method)

In [85]:
methods(listarstockholm)


Out[85]:
1 method for generic function listarstockholm:
  • listarstockholm(carpeta) at In[84]:1

Documentación

En cualquier lugar del código usando el macro @doc o con un string justo arriba de la declaración de la función. Se accede escribiendo ? antes del nombre de la función


In [86]:
@doc """
```listaralineamientos(direccion, extension::Regex=r"\.fasta\$"; vacios::Bool=false)```  

Retorna una lista de los archivos de alineamientos en la `dirección`. Por defecto busca archivos con extensión fasta que no estén vacíos.
""" listaralineamientos

In [87]:
?listaralineamientos


search: 
Out[87]:

listaralineamientos(direccion, extension::Regex=r".fasta$"; vacios::Bool=false)

Retorna una lista de los archivos de alineamientos en la dirección. Por defecto busca archivos con extensión fasta que no estén vacíos.


In [88]:
"Muestra las primeras `n` líneas de los archivos fastas en la `carpeta`"
function head_fastas(carpeta, n::Int=10)
    for nombre in listaralineamientos(carpeta)
        println("# ---- $nombre ---- #")
        run(`head -$n $( joinpath(carpeta, nombre) )`) # Corre un comando/programa externo 
    end
end


listaralineamientos

Out[88]:
head_fastas (generic function with 2 methods)

In [89]:
?head_fastas


search: 
Out[89]:

Muestra las primeras n líneas de los archivos fastas en la carpeta


In [90]:
head_fastas("data", 4)


head_fastas

# ---- Gaoetal2011.fasta ---- #
>SEQ1
DAWAEE
>SEQ2
DAWAEF
# ---- PF09645_full.fasta ---- #

In [91]:
head_fastas("data", n=4) # n es posicional, no es un keyword argument


LoadError: ArgumentError: function head_fastas does not accept keyword arguments
while loading In[91], in expression starting on line 1

Packages


In [92]:
# Pkg.add("Gadfly")
# Pkg.add("RDatasets")

In [93]:
using Gadfly # Similar a ggplot2 de R

using RDatasets # Los datasets de ejemplos de R

iris = dataset("datasets", "iris")

describe(iris) # summary(iris) en R


INFO: Precompiling module Gadfly...
>C3N734_SULIY/1-95
...mp---NSYQMAEIMYKILQQKKEISLEDILAQFEISASTAYNVQRTLRMICEKHPDE
CEVQTKNRRTIFKWIKNEETTEEGQEE--QEIEKILNAQPAE-------------k....
>H2C869_9CREN/7-104
WARNING: Base.Nothing is deprecated, use Void instead.
WARNING: eval from module Compose to Gadfly:    
Expr(:import, :Patchwork)::Any
  ** incremental compilation may be broken for this module **

WARNING: Base.MathConst is deprecated, use Base.Irrational instead.
WARNING: Base.MathConst is deprecated, use Base.Irrational instead.
WARNING: Base.MathConst is deprecated, use Base.Irrational instead.
WARNING: Base.MathConst is deprecated, use Base.Irrational instead.
WARNING: Base.MathConst is deprecated, use Base.Irrational instead.
WARNING: Base.MathConst is deprecated, use Base.Irrational instead.
WARNING: Base.MathConst is deprecated, use Base.Irrational instead.
WARNING: Base.MathConst is deprecated, use Base.Irrational instead.
WARNING: Base.MathConst is deprecated, use Base.Irrational instead.
WARNING: Base.MathConst is deprecated, use Base.Irrational instead.
WARNING: Base.MathConst is deprecated, use Base.Irrational instead.
WARNING: Base.MathConst is deprecated, use Base.Irrational instead.
WARNING: Base.MathConst is deprecated, use Base.Irrational instead.
WARNING: Base.MathConst is deprecated, use Base.Irrational instead.
WARNING: Base.MathConst is deprecated, use Base.Irrational instead.
WARNING: Base.MathConst is deprecated, use Base.Irrational instead.
WARNING: Base.MathConst is deprecated, use Base.Irrational instead.
WARNING: Base.MathConst is deprecated, use Base.Irrational instead.
WARNING: Base.MathConst is deprecated, use Base.Irrational instead.
WARNING: Base.MathConst is deprecated, use Base.Irrational instead.
WARNING: Base.FloatingPoint is deprecated, use AbstractFloat instead.
WARNING: Base.FloatingPoint is deprecated, use AbstractFloat instead.
WARNING: Base.FloatingPoint is deprecated, use AbstractFloat instead.
WARNING: Base.FloatingPoint is deprecated, use AbstractFloat instead.
WARNING: Base.FloatingPoint is deprecated, use AbstractFloat instead.
WARNING: Base.FloatingPoint is deprecated, use AbstractFloat instead.
WARNING: Base.FloatingPoint is deprecated, use AbstractFloat instead.
WARNING: Base.FloatingPoint is deprecated, use AbstractFloat instead.
WARNING: Base.FloatingPoint is deprecated, use AbstractFloat instead.
WARNING: Base.FloatingPoint is deprecated, use AbstractFloat instead.
WARNING: Base.FloatingPoint is deprecated, use AbstractFloat instead.
WARNING: Base.FloatingPoint is deprecated, use AbstractFloat instead.
WARNING: Base.FloatingPoint is deprecated, use AbstractFloat instead.
WARNING: Base.FloatingPoint is deprecated, use AbstractFloat instead.
WARNING: Base.FloatingPoint is deprecated, use AbstractFloat instead.
WARNING: Base.FloatingPoint is deprecated, use AbstractFloat instead.
WARNING: Base.FloatingPoint is deprecated, use AbstractFloat instead.
WARNING: Base.FloatingPoint is deprecated, use AbstractFloat instead.
WARNING: Base.FloatingPoint is deprecated, use AbstractFloat instead.
WARNING: Base.FloatingPoint is deprecated, use AbstractFloat instead.
WARNING: Base.FloatingPoint is deprecated, use AbstractFloat instead.
WARNING: Base.FloatingPoint is deprecated, use AbstractFloat instead.
WARNING: Base.FloatingPoint is deprecated, use AbstractFloat instead.
WARNING: Base.String is deprecated, use AbstractString instead.
WARNING: Base.String is deprecated, use AbstractString instead.
WARNING: Base.String is deprecated, use AbstractString instead.
SepalLength
Min      4.3

In [94]:
plot(iris, x="Species", y="PetalLength", color="Species", Geom.boxplot)


Out[94]:
Species setosa versicolor virginica setosa versicolor virginica Species -10 -8 -6 -4 -2 0 2 4 6 8 10 12 14 16 18 -8.0 -7.5 -7.0 -6.5 -6.0 -5.5 -5.0 -4.5 -4.0 -3.5 -3.0 -2.5 -2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 6.0 6.5 7.0 7.5 8.0 8.5 9.0 9.5 10.0 10.5 11.0 11.5 12.0 12.5 13.0 13.5 14.0 14.5 15.0 15.5 16.0 -10 0 10 20 -8.0 -7.5 -7.0 -6.5 -6.0 -5.5 -5.0 -4.5 -4.0 -3.5 -3.0 -2.5 -2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 6.0 6.5 7.0 7.5 8.0 8.5 9.0 9.5 10.0 10.5 11.0 11.5 12.0 12.5 13.0 13.5 14.0 14.5 15.0 15.5 16.0 PetalLength
1st Qu.  5.1
Median   5.8
Mean     5.843333333333334
3rd Qu.  6.4
Max      7.9
NAs      0
NA%      0.0%

SepalWidth
Min      2.0
1st Qu.  2.8
Median   3.0
Mean     3.0573333333333332
3rd Qu.  3.3
Max      4.4
NAs      0
NA%      0.0%

PetalLength
Min      1.0
1st Qu.  1.6
Median   4.35
Mean     3.7579999999999996
3rd Qu.  5.1
Max      6.9
NAs      0
NA%      0.0%

PetalWidth
Min      0.1
1st Qu.  0.3
Median   1.3
Mean     1.1993333333333331
3rd Qu.  1.8
Max      2.5
NAs      0
NA%      0.0%

Species
Length  150
Type    Pooled ASCIIString
NAs     0
NA%     0.0%
Unique  3


In [95]:
plot(iris, color="Species", x="PetalLength", Geom.histogram)


Out[95]:
PetalLength -10 -8 -6 -4 -2 0 2 4 6 8 10 12 14 16 18 -8.0 -7.5 -7.0 -6.5 -6.0 -5.5 -5.0 -4.5 -4.0 -3.5 -3.0 -2.5 -2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 6.0 6.5 7.0 7.5 8.0 8.5 9.0 9.5 10.0 10.5 11.0 11.5 12.0 12.5 13.0 13.5 14.0 14.5 15.0 15.5 16.0 -10 0 10 20 -8.0 -7.5 -7.0 -6.5 -6.0 -5.5 -5.0 -4.5 -4.0 -3.5 -3.0 -2.5 -2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 6.0 6.5 7.0 7.5 8.0 8.5 9.0 9.5 10.0 10.5 11.0 11.5 12.0 12.5 13.0 13.5 14.0 14.5 15.0 15.5 16.0 setosa versicolor virginica Species -20 -15 -10 -5 0 5 10 15 20 25 30 35 -15.0 -14.5 -14.0 -13.5 -13.0 -12.5 -12.0 -11.5 -11.0 -10.5 -10.0 -9.5 -9.0 -8.5 -8.0 -7.5 -7.0 -6.5 -6.0 -5.5 -5.0 -4.5 -4.0 -3.5 -3.0 -2.5 -2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 6.0 6.5 7.0 7.5 8.0 8.5 9.0 9.5 10.0 10.5 11.0 11.5 12.0 12.5 13.0 13.5 14.0 14.5 15.0 15.5 16.0 16.5 17.0 17.5 18.0 18.5 19.0 19.5 20.0 20.5 21.0 21.5 22.0 22.5 23.0 23.5 24.0 24.5 25.0 25.5 26.0 26.5 27.0 27.5 28.0 28.5 29.0 29.5 30.0 -20 0 20 40 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

In [96]:
plot(iris, x=:PetalLength, y=:PetalWidth, color=:Species, Geom.point, Geom.smooth(method=:lm))


Out[96]:
PetalLength -10 -8 -6 -4 -2 0 2 4 6 8 10 12 14 16 18 -8.0 -7.5 -7.0 -6.5 -6.0 -5.5 -5.0 -4.5 -4.0 -3.5 -3.0 -2.5 -2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 6.0 6.5 7.0 7.5 8.0 8.5 9.0 9.5 10.0 10.5 11.0 11.5 12.0 12.5 13.0 13.5 14.0 14.5 15.0 15.5 16.0 -10 0 10 20 -8.0 -7.5 -7.0 -6.5 -6.0 -5.5 -5.0 -4.5 -4.0 -3.5 -3.0 -2.5 -2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 6.0 6.5 7.0 7.5 8.0 8.5 9.0 9.5 10.0 10.5 11.0 11.5 12.0 12.5 13.0 13.5 14.0 14.5 15.0 15.5 16.0 setosa versicolor virginica Species -3.0 -2.5 -2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 -2.5 -2.4 -2.3 -2.2 -2.1 -2.0 -1.9 -1.8 -1.7 -1.6 -1.5 -1.4 -1.3 -1.2 -1.1 -1.0 -0.9 -0.8 -0.7 -0.6 -0.5 -0.4 -0.3 -0.2 -0.1 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 4.0 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 5.0 -2.5 0.0 2.5 5.0 -2.6 -2.4 -2.2 -2.0 -1.8 -1.6 -1.4 -1.2 -1.0 -0.8 -0.6 -0.4 -0.2 0.0 0.2 0.4 0.6 0.8 1.0 1.2 1.4 1.6 1.8 2.0 2.2 2.4 2.6 2.8 3.0 3.2 3.4 3.6 3.8 4.0 4.2 4.4 4.6 4.8 5.0 PetalWidth

In [97]:
# Pkg.add("GLM")

In [98]:
using GLM

linear = fit(LinearModel, PetalWidth ~ PetalLength, iris) # PetalLength en R: 0.4157554


Out[98]:
DataFrames.DataFrameRegressionModel{GLM.LinearModel{GLM.DensePredQR{Float64}},Float64}:

Coefficients:
              Estimate  Std.Error  t value Pr(>|t|)
(Intercept)  -0.363076   0.039762 -9.13122   <1e-15
PetalLength   0.415755 0.00958244  43.3872   <1e-85
WARNING: Base.String is deprecated, use AbstractString instead.
WARNING: Base.String is deprecated, use AbstractString instead.
WARNING: Base.String is deprecated, use AbstractString instead.

MIToS


In [99]:
# Pkg.add("MIToS")

In [100]:
using MIToS.MSA


WARNING: New definition 
    parse(Any, Type{MIToS.MSA.Stockholm}) at /home/dzea/.julia/v0.4/MIToS/src/MSA/Pfam.jl:96
is ambiguous with: 
    parse(Type{#C<:ColorTypes.Colorant}, Any) at /home/dzea/.julia/v0.4/Colors/src/parse.jl:136.
To fix, define 
    parse(Type{#C<:ColorTypes.Colorant}, Type{MIToS.MSA.Stockholm})
before the new definition.

In [101]:
aln = read("data/PF09645_full.stockholm", Stockholm, generatemapping=true, useidcoordinates=true)


Out[101]:
4x110 MIToS.MSA.AnnotatedMultipleSequenceAlignment:
 -  -  -  N  S  Y  Q  M  A  E  I  M  Y  …  -  -  -  -  -  -  -  -  -  -  -  -
 -  -  L  N  D  V  Q  R  A  K  L  L  V     -  -  -  -  -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  V  A  Q  Q  L  F     -  -  -  -  -  -  -  -  -  -  -  -
 Q  T  L  N  S  Y  K  M  A  E  I  M  Y     E  Q  T  D  Q  G  F  I  K  A  K  Q

In [102]:
print(aln)


#=GF ColMap   6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115

In [103]:
print(aln, FASTA)

In [104]:
write("output", read("data/PF09645_full.stockholm", Stockholm), FASTA) # Stockholm to FASTA (simple)

In [105]:
open("output", "r") do fh 
    for line in eachline(fh)
        print(line)
    end
end


#=GF MIToS_2015-10-10T18:54:41   deletefullgaps!  :  Deletes 10 columns full of gaps (inserts generate full gap columns on MIToS because lowercase and dots are not allowed)
#=GF MIToS_2015-10-10T18:54:41   filtercolumns! : 10 columns have been deleted.
#=GS Y070_ATV/2-70	AC Q3V4T1.1
#=GS Y070_ATV/2-70	SeqMap ,,,,,,,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
#=GS H2C869_9CREN/7-104	AC H2C869.1
#=GS F112_SSV1/3-112	SeqMap 3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112
#=GS F112_SSV1/3-112	AC P20220.1
#=GS F112_SSV1/3-112	DR PDB; 2VQC A; 4-73;
#=GS C3N734_SULIY/1-95	AC C3N734.1
#=GS H2C869_9CREN/7-104	SeqMap ,,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,,,,,,,,,,,,,,,,
#=GS C3N734_SULIY/1-95	SeqMap ,,,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,,,82,83,84,85,86,87,88,89,90,91,92,93,94,,,,,,,,,,,,,
C3N734_SULIY/1-95		---NSYQMAEIMYKILQQKKEISLEDILAQFEISASTAYNVQRTLRMICEKHPDECEVQTKNRRTIFKWIKNEETTEEGQEE--QEIEKILNAQPAE-------------
H2C869_9CREN/7-104		--LNDVQRAKLLVKILQAKGELDVYDIMLQFEISYTRAIPIMKLTRKICEAQ-EICTYDEKEHKLVSLNAKKEKVEQDEEENEREEIEKILDAH----------------
Y070_ATV/2-70		-------VAQQLFSKLREKKEITAEDIIAIYNVTPSVAYAIFTVLKVMCQQHQGECQAIKRGRKTVI-------------------------------------------
F112_SSV1/3-112		QTLNSYKMAEIMYKILEKKGELTLEDILAQFEISVPSAYNIQRALKAICERHPDECEVQYKNRKTTFKWIKQEQKEEQKQEQTQDNIAKIFDAQPANFEQTDQGFIKAKQ
#=GR F112_SSV1/3-112	SS	X---HHHHHHHHHHHHHHHSEE-HHHHHHHH---HHHHHHHHHHHHHHHHH-TTTEEEEE-SS-EEEEE--XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
#=GC seq_cons			...NshphAclhaKILppKtElolEDIlAQFEISsosAYsI.+sL+hICEpH.-ECpsppKsRKTlhh.hKpEphppptpEp..ppItKIhsAp................
#=GC SS_cons			X---HHHHHHHHHHHHHHHSEE-HHHHHHHH---HHHHHHHHHHHHHHHHH-TTTEEEEE-SS-EEEEE--XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
//
>C3N734_SULIY/1-95
---NSYQMAEIMYKILQQKKEISLEDILAQFEISASTAYNVQRTLRMICEKHPDECEVQTKNRRTIFKWIKNEETTEEGQEE--QEIEKILNAQPAE-------------
>H2C869_9CREN/7-104
--LNDVQRAKLLVKILQAKGELDVYDIMLQFEISYTRAIPIMKLTRKICEAQ-EICTYDEKEHKLVSLNAKKEKVEQDEEENEREEIEKILDAH----------------
>Y070_ATV/2-70
-------VAQQLFSKLREKKEITAEDIIAIYNVTPSVAYAIFTVLKVMCQQHQGECQAIKRGRKTVI-------------------------------------------
>F112_SSV1/3-112
QTLNSYKMAEIMYKILEKKGELTLEDILAQFEISVPSAYNIQRALKAICERHPDECEVQYKNRKTTFKWIKQEQKEEQKQEQTQDNIAKIFDAQPANFEQTDQGFIKAKQ
>C3N734_SULIY/1-95
---NSYQMAEIMYKILQQKKEISLEDILAQFEISASTAYNVQRTLRMICEKHPDECEVQTKNRRTIFKWIKNEETTEEGQEE--QEIEKILNAQPAE-------------
>H2C869_9CREN/7-104
--LNDVQRAKLLVKILQAKGELDVYDIMLQFEISYTRAIPIMKLTRKICEAQ-EICTYDEKEHKLVSLNAKKEKVEQDEEENEREEIEKILDAH----------------
>Y070_ATV/2-70
-------VAQQLFSKLREKKEITAEDIIAIYNVTPSVAYAIFTVLKVMCQQHQGECQAIKRGRKTVI-------------------------------------------
>F112_SSV1/3-112
QTLNSYKMAEIMYKILEKKGELTLEDILAQFEISVPSAYNIQRALKAICERHPDECEVQYKNRKTTFKWIKQEQKEEQKQEQTQDNIAKIFDAQPANFEQTDQGFIKAKQ